/*
 * Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package it.unipd.dei.bd.icineasti.servlet;

import it.unipd.dei.bd.icineasti.database.GetPoltroneDatabase;
import it.unipd.dei.bd.icineasti.resource.PoltronaConDisponibilita;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

/**
 * Restituisce un pezzo di tabella in html che mostra le poltrone della sala.
 * 
 * @author Visentin Lorenzo
 * @version 1.00
 */
public class GetPoltroneServlet extends AbstractDatabaseServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {

		// imposta il tipo MIME della risposta
		res.setContentType("text/html");

		// ottiene un flusso di uscita per scrivere la risposta
		PrintWriter out = res.getWriter();
		
		int codiceSede = Integer.valueOf(req.getParameter("sedePrenotazione"));
		int codiceSpettacolo = Integer.valueOf(req.getParameter("codiceSpettacolo"));
		int codiceSala = Integer.valueOf(req.getParameter("salaPrenotazione"));

		Connection con = null;

		try {
			con = DS.getConnection();
			
			List<PoltronaConDisponibilita> poltrone = new GetPoltroneDatabase(con, codiceSede, codiceSala, codiceSpettacolo).elencaPoltrone();
			
			/* Tutto quello che segue è per tenere conto delle poltrone mancanti */
			int numeroMin = Integer.MAX_VALUE;		// Numero minimo per una poltrona
			int numeroMax = 0;						// Numero massimo per una poltrona
			for (PoltronaConDisponibilita e : poltrone) {
				int numero = e.getNumero();
				if (numero < numeroMin) {
					numeroMin = numero;
				}
				if (numero > numeroMax) {
					numeroMax = numero;
				}
			}
		//	String filaMin;		// Fila minima per una poltrona
			String filaMax;		// Fila massima per una poltrona
			if (!poltrone.isEmpty()) {
			//	filaMin = poltrone.get(0).getFila();
				filaMax = poltrone.get(poltrone.size() - 1).getFila();

				String[] alfabeto = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
				ArrayList<String> elencoCompletoPoltrone = new ArrayList<String>();
				int contAlfabeto = 0;
				while (alfabeto[contAlfabeto].compareTo(filaMax) <= 0) {
					for (int i = 1; i <= numeroMax; i++) {
						elencoCompletoPoltrone.add(alfabeto[contAlfabeto] + i);
					}
					contAlfabeto++;
				}
				
				int j = 0;		// Indice per la lista di poltrone restituita dal DB
				String filaAttuale = elencoCompletoPoltrone.get(0).substring(0, 1);
				out.println("<table class=\"tabella-posti\">");
				out.println("<tr>");
				for (int i = 0; i < elencoCompletoPoltrone.size(); i++) {
					if (j < poltrone.size()) {
						if (!elencoCompletoPoltrone.get(i).substring(0, 1).equals(filaAttuale)) {	// Nuova riga
							filaAttuale = elencoCompletoPoltrone.get(i).substring(0, 1);
							out.println("</tr>");
							out.println("<tr>");
						}
						if (((String)(poltrone.get(j).getFila() + poltrone.get(j).getNumero())).equals(elencoCompletoPoltrone.get(i))) {
							if (poltrone.get(j).getDisponibile()) {		// Poltrona disponibile
								out.println("<td class=\"poltrona\" cod=\"" + elencoCompletoPoltrone.get(i) + "\" riservato=\"0\" selezionato=\"0\"></td>");
							} else {		// Poltrona non prenotabile
								out.println("<td class=\"poltrona\" cod=\"" + elencoCompletoPoltrone.get(i) + "\" riservato=\"1\" selezionato=\"0\"></td>");
							}
							j++;
						} else {
							out.println("<td class=\"corridoio\"></td>");
						}
					}
				}
				out.println("</tr>");
				out.println("</table>");
			}
			

			/* Codice in Javascript */

			out.println("<script type=\"text/javascript\">");
			/* Inserisco la funzione indexOf non presente in tutti i browser */
			out.println("	if (!Array.prototype.indexOf) {");
			out.println("		Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {");
			out.println("			\"use strict\";");
			out.println("			if (this == null) {");
			out.println("				throw new TypeError();");
			out.println("			}");
			out.println("			var t = Object(this);");
			out.println("			var len = t.length >>> 0;");
			out.println("			if (len === 0) {");
			out.println("				return -1;");
			out.println("			}");
			out.println("			var n = 0;");
			out.println("			if (arguments.length > 1) {");
			out.println("				n = Number(arguments[1]);");
			out.println("			    if (n != n) { // shortcut for verifying if it's NaN");
			out.println("					n = 0;");
			out.println("	    		} else if (n != 0 && n != Infinity && n != -Infinity) {");
			out.println("					n = (n > 0 || -1) * Math.floor(Math.abs(n));");
			out.println("			    }");
			out.println("			}");
			out.println("			if (n >= len) {");
			out.println("	    		return -1;");
			out.println("			}");
			out.println("			var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);");
			out.println("			for (; k < len; k++) {");
			out.println("			    if (k in t && t[k] === searchElement) {");
			out.println("					return k;");
			out.println("			    }");
			out.println("			}");
			out.println("			return -1;");
			out.println("		}");
			out.println("	}");

							/* Vettore finale da passare agli strati sottostanti; contiene 1 in corrispondenza dei posti selezionati, 0 altrimenti */
			out.println("	var vettFinale = new Array(5);");

							/* Inizializzazione a 0 del vettore finale */
			out.println("	for (var i = 0; i < vettFinale.length; i++) {");
			out.println("		vettFinale[i] = '';");
			out.println("	}");
							/* Cambiamento stato poltrone e conteggio posti selezionati */
			out.println("	var numSelezionati = 0;		// Conta il numero totale di posti selezionati (se > 5 non si possono prenotare)");
			out.println("	$(\".poltrona\").click(function() {");
			out.println("		if ($(this).attr(\"riservato\") == \"0\") {");
			out.println("			if ($(this).attr(\"selezionato\") == \"0\") {");
			out.println("				if (numSelezionati == 5) {");
			out.println("					alert(\"Attenzione: non si possono prenotare piu' di 5 posti ne' si possono acquistare piu' di 5 posti per sessione.\");");
			out.println("					return;");
			out.println("				}");
			out.println("				$(this).attr(\"selezionato\", \"1\");");
			out.println("				vettFinale[numSelezionati++] = $(this).attr(\"cod\");		// Aggiorno il vettore finale");
			out.println("			} else {");
			out.println("				var index = vettFinale.indexOf($(this).attr(\"cod\"));	// Indice del posto da rimuovere nel vettore");
			out.println("				vettFinale.splice(index, 1);							// Tolgo l'elemento");
			out.println("				$(this).attr(\"selezionato\", \"0\");");
			out.println("				numSelezionati--;");
			out.println("			}");
			out.println("		}");
			out.println("	/*	alert(vettFinale);*/");
			out.println("	});");
			
			out.println("</script>");
			/* Fine codice in Javascript */

			
		} catch (NullPointerException e) {
			out.printf("<p><center><font color=\"red\" size=\"+2\">Impossibile creare la connessione al database.</font></center></p>");
		} catch (SQLException e) {
			out.printf(
					"<p><center><font color=\"red\" size=\"+2\">Errore durante l'accesso al database: %s</font></center></p>",
					e.getMessage());
		}

		// assicura che tutto il contenuto sia inviato
		out.flush();

		// chiude il flusso di uscita
	//	out.close();

	}

}
